import json
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from langchain.output_parsers import PydanticOutputParser
from large_model.mode_interface.model_interface import ChatInterface
from large_model.case_template.case_template import TestCase
from utils.yaml_utils import read_template_yaml_all, save_test_cases
from utils.yaml_template import case_template


class SessionDetail:

    def run_session_detail(self):
        chat = ChatInterface().chat_model()

        parser = PydanticOutputParser(pydantic_object=TestCase)

        # 通过手动传入，这个接口的参数，这个相当于是接口文档
        template = read_template_yaml_all('sessiondetail_template.yaml')

        prompt = PromptTemplate(
            # {{}} lanchain 会识别为普通文本
            # template="请你帮我生成三组数据，要求输出纯json格式，不要使用Markdown代码块包裹json，格式要求为{format_instructions}, 文本信息{parser}",
            template="你是一个经验丰富的测试专家，我需要你根据接口文档的信息{template}编写接口测试用例，"
                     "要求输出纯json格式，不要使用Markdown代码块包裹json，格式要求为{format_instructions}, 接口数据格式为{parser}"
                     "进过调试，接口返回的结果有以下几种"
                     "1.正确请求返回：{{'code': 0, 'msg': '', 'data': ...}}"
                     "2.参数异常：{{'code': 13440, 'msg': 'invalid parameter', 'data': null}}"
                     "3.会话不存在：{{'code': 13440, 'msg': 'session not found', 'data': None}}"
                     "4.项目不存在：{{'code': 13440, 'msg': 'error', 'data': None}}"
                     "5.缺少必填参数：{{'code': 13440, 'msg': 'invalid SessionDetailReq.ProjId: value must be greater than 0', 'data': null}}"
                     "6.ticket_id 不存在，是随机生成的，或者是1234：{{ 'code': 13440, 'msg': 'session not found', 'data': None }}"
                     "注意输出的json格式，在设计用例时一定要注意断言和传参对应，必须使用列表嵌套json的形式总输出最后的的结果",
            # 定义输入的参数
            input_variables=["template", "parser"],
            # 定义partial_variables
            partial_variables={"format_instructions": parser.get_format_instructions()}
        )

        # 链式输出
        chain = prompt | chat
        result = chain.invoke({
            "template": template,
            "parser": '{},字典格式'
        })

        data_dict = json.loads(result.content)
        test_cases = []
        for data in data_dict:
            print(data)
            test_cases.append(data)
        # 大模型生成测试用例，写入yaml文件
        save_test_cases(test_cases, "session/sessiondetail.yaml")
        # 写入文件后，然后在生成测试文件
        # 把生成测试测试用例，变为.py文件, 测试用例，一定是要以test_开头
        case_template("session/sessiondetail.yaml", "session/test_sessiondetail")
